﻿using Credinka.Ayni.SEA.EN;
using Credinka.Ayni.SEA.RN;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using Credinka.Ayni.GEN.UTL;
using System.IO;
using System.Transactions;
using System.Text;

public partial class RegistrarFormulario : System.Web.UI.Page
{
    private enFormulario oenFormulario;
    private rnFormulario ornFormulario;

    private List<enDescripcion> loenObjeto;
    private enDescripcion oenDescripcion;
    private rnDescripcion ornDescripcion;

    private List<enFormularioObjeto> loenFormularioObjeto;
    private enFormularioObjeto oenFormularioObjeto;
    private rnFormularioObjeto ornFormularioObjeto;

    private enLog oenLog;
    private rnLog ornLog;

    string codigo = string.Empty;

    #region Eventos

    protected void Page_Load(object sender, EventArgs e)
    {
        codigo = Page.Request.QueryString.AllKeys.ToList().Count > 0 ? Page.Request.QueryString["codigo"].ToString() : string.Empty;

        if (!Page.IsPostBack)
        {
            ListarObjeto();
            CargarEstado();
            CargarModulo();

            if (!codigo.Equals(string.Empty))
            {
                hdfFormulario.Value = codigo;
                ObtenerFormulario();
                CargarObjetoSeleccionado();
            }
        }
    }

    protected void btnSi_Click(object sender, EventArgs e)
    {
        oenFormulario = new enFormulario();
        ornFormulario = new rnFormulario();

        oenFormulario.Nombre = txtNombre.Value;
        oenFormulario.CodigoEstado = int.Parse(ddlEstado.SelectedValue);        
        oenFormulario.Decripcion = "Modulos/" + this.ddlModulo.SelectedItem.Value.Trim().ToUpper() + "/" + this.txtRuta.Value.Trim().ToUpper();
        oenFormulario.Version = txtVersion.Value;
        oenFormulario.TiempoSesion = txtTiempoSesion.Value == string.Empty ? 0 : int.Parse(txtTiempoSesion.Value);

        if (hdfFormulario.Value != String.Empty)
        {
            //ACTUALIZAR FORMULARIO
            oenFormulario.IdFormulario = int.Parse(hdfFormulario.Value);
            oenFormulario.AudNombreUsuarioModificacion = utlAuditoria.ObtenerUsuarioDominio();
            oenFormulario.AudIPModificacion = utlAuditoria.ObtenerDireccionIP();
            oenFormulario.AudMacModificacion = utlAuditoria.ObtenerDireccionMAC();

            int idFormulario = ornFormulario.Modificar(oenFormulario);
            if (idFormulario != 0)
            {
                GuardarObjetos(int.Parse(hdfFormulario.Value));
                StringBuilder sb = new StringBuilder();
                sb.Append(@"<script language='javascript'>");
                sb.Append(@"var lbl =  AbrirModal('330', '210', true, false, '#confirmacion', false);");
                sb.Append(@"$('#confirmacion').css('display', 'block');");
                sb.Append(@"</script>");
                ClientScript.RegisterStartupScript(this.GetType(), "JSScript", sb.ToString());
            }
            else
            {
                dvAlerta2.InnerHtml = "<p style='padding-left:40px'>El nombre del formulario ya se encuentra registrado en la base de datos.";
                fijo.Attributes.CssStyle.Add("height", "50px");
                dvAlerta2.Attributes.CssStyle.Add("display", "block");
            }
        }
        else
        {
            //REGISTRAR FORMULARIO
            oenFormulario.AudNombreUsuarioCreacion = utlAuditoria.ObtenerUsuarioDominio();
            oenFormulario.AudIPCreacion = utlAuditoria.ObtenerDireccionIP();
            oenFormulario.AudMacCreacion = utlAuditoria.ObtenerDireccionMAC();
            TransactionScope scope = new TransactionScope();
            using (scope)
            {
                int idFormulario = ornFormulario.Registrar(oenFormulario);

                if (idFormulario != 0)
                {
                    GuardarObjetos(idFormulario);
                    scope.Complete();

                    StringBuilder sb = new StringBuilder();
                    sb.Append(@"<script language='javascript'>");
                    sb.Append(@"var lbl =  AbrirModal('330', '210', true, false, '#confirmacion', false);");
                    sb.Append(@"$('#confirmacion').css('display', 'block');");
                    sb.Append(@"</script>");
                    ClientScript.RegisterStartupScript(this.GetType(), "JSScript", sb.ToString());
                }
                else
                {
                    dvAlerta2.InnerHtml = "<p style='padding-left:40px'>El nombre del formulario ya se encuentra registrado en la base de datos.";
                    fijo.Attributes.CssStyle.Add("height", "50px");
                    dvAlerta2.Attributes.CssStyle.Add("display", "block");
                }
            }
        }
    }

    private void GuardarObjetos(int codigo)
    {
        var nombreAlerta = Session["elementoNombreSeleccionado"];
        int idAlerta = Convert.ToInt32(Session["elementoSeleccionado"]);

        ornFormularioObjeto = new rnFormularioObjeto();
        oenFormularioObjeto = new enFormularioObjeto();
        loenFormularioObjeto = (List<enFormularioObjeto>)Session["ObjetosBD"] == null ? new List<enFormularioObjeto>() : (List<enFormularioObjeto>)Session["ObjetosBD"];

        oenFormularioObjeto.IdFormulario = codigo;
        oenFormularioObjeto.CodigoEstado = Convert.ToInt32(utlEnumerado.Estado.Activo);

        foreach (RepeaterItem rw in rptObjeto.Items)
        {
            CheckBox chkBx = (CheckBox)rw.FindControl("ChkObjeto");

            var itemCodigoElemento = int.Parse(chkBx.InputAttributes["CodigoElemento"].ToString());
            if (chkBx.Checked)
            {
                var newList = loenFormularioObjeto.FindAll(s => s.CodigoObjeto == itemCodigoElemento);
                if (newList.Count == 0)
                {
                    oenFormularioObjeto.CodigoObjeto = itemCodigoElemento;
                    oenFormularioObjeto.IdAlerta = idAlerta;
                    if (idAlerta != 0)
                        oenFormularioObjeto.bAlerta = true;
                    oenFormularioObjeto.AudNombreUsuarioCreacion = utlAuditoria.ObtenerUsuarioDominio();
                    oenFormularioObjeto.AudIPCreacion = utlAuditoria.ObtenerDireccionIP();
                    oenFormularioObjeto.AudMacCreacion = utlAuditoria.ObtenerDireccionMAC();
                    oenFormularioObjeto.udFechaCreacion = DateTime.Now;
                    ornFormularioObjeto.Registrar(oenFormularioObjeto);
                }
            }
            else
            {
                var newList = loenFormularioObjeto.FindAll(s => s.CodigoObjeto == itemCodigoElemento);
                foreach (var itemNew in newList)
                {
                    oenFormularioObjeto.IdFormularioObjeto = itemNew.IdFormularioObjeto;
                    oenFormularioObjeto.IdAlerta = idAlerta;
                    oenFormularioObjeto.AudMacModificacion = utlAuditoria.ObtenerDireccionMAC();
                    oenFormularioObjeto.AudNombreUsuarioModificacion = utlAuditoria.ObtenerUsuarioDominio();
                    oenFormularioObjeto.AudIPModificacion = utlAuditoria.ObtenerDireccionIP();
                    ornFormularioObjeto.Eliminar(oenFormularioObjeto);
                }
            }
        }
    }

    protected void rptObjeto_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var item = e.Item.DataItem as enDescripcion;
            if (item != null)
            {
                var chk = e.Item.FindControl("chkObjeto") as CheckBox;
                if (chk != null)
                    chk.InputAttributes.Add("CodigoElemento", item.CodigoElemento.ToString());
            }
        }
    }

    #endregion

    #region Métodos

    private void ObtenerFormulario()
    {
        oenFormulario = new enFormulario();
        ornFormulario = new rnFormulario();
        oenFormulario.IdFormulario = int.Parse(codigo);
        oenFormulario = ornFormulario.Obtener(oenFormulario);
        txtNombre.Value = oenFormulario.Nombre;
        txtVersion.Value = oenFormulario.Version;
        txtTiempoSesion.Value = oenFormulario.TiempoSesion.ToString();
        ddlEstado.SelectedValue = oenFormulario.CodigoEstado.ToString();
    }

    private void CargarEstado()
    {
        ornDescripcion = new rnDescripcion();
        ddlEstado.DataSource = ornDescripcion.ListarEstado();
        ddlEstado.DataTextField = "Descripcion";
        ddlEstado.DataValueField = "CodigoElemento";
        ddlEstado.DataBind();
    }

    private void CargarModulo()
    {
        ornDescripcion = new rnDescripcion();
        this.ddlModulo.DataSource = ornDescripcion.ListarSistema();
        this.ddlModulo.DataTextField = "Descripcion";
        this.ddlModulo.DataValueField = "DescripcionCorta";
        this.ddlModulo.DataBind();
    }

    private void ListarObjeto()
    {
        oenDescripcion = new enDescripcion();
        ornDescripcion = new rnDescripcion();
        loenObjeto = ornDescripcion.ListarObjeto();

        rptObjeto.DataSource = loenObjeto;
        rptObjeto.DataBind();
    }

    private void CargarObjetoSeleccionado()
    {
        oenFormularioObjeto = new enFormularioObjeto();
        ornFormularioObjeto = new rnFormularioObjeto();

        oenFormularioObjeto.IdFormulario = int.Parse(codigo);
        loenFormularioObjeto = ornFormularioObjeto.ListarObjeto(oenFormularioObjeto);
        Session["ObjetosBD"] = loenFormularioObjeto;

        foreach (RepeaterItem item in rptObjeto.Items)
        {
            foreach (enFormularioObjeto itemObtenidos in loenFormularioObjeto)
            {
                CheckBox chk= (CheckBox)item.FindControl("chkObjeto");
                CheckBox chkAlerta = (CheckBox)item.FindControl("chkAlerta");

                if (int.Parse(chk.InputAttributes["CodigoElemento"]) == itemObtenidos.CodigoObjeto){
                    chk.Checked = true;
                    chkAlerta.Checked = true;
                }
            }
        }
    }

    private void RegistrarLog()
    {
        oenLog = new enLog();
        ornLog = new rnLog();
        enUsuario oenUsuario = (enUsuario)Session["obe_Usuario"];
        oenLog.IdUsuario = oenUsuario.IdUsuario;
        oenLog.NombreUsuario = oenUsuario.NombreUsuario;
        oenLog.NombreCompleto = oenUsuario.NombreCompleto;
        oenLog.AudIpCreacion = utlAuditoria.ObtenerDireccionIP();
        oenLog.AudMacCreacion = utlAuditoria.ObtenerDireccionMAC();
        oenLog.AudFechaCreacion = DateTime.Now;
        oenLog.Cargo = oenUsuario.entDescripcion.Descripcion.ToString();
        oenLog.Mensaje = string.Empty;
        oenLog.Operacion = utlConstante.TipoOperacionRegistro;
        oenLog.Agencia = Session["NombreOficina"].ToString();
        oenLog.Seguimiento = btnGrabar.Text;

        //Registrar Log
        ornLog.Registrar(oenLog);
    }

    #endregion
}